package com.towerdefence.enemies
{
	/**
	* EnemyBase.as 
	* - базовый класс для всех врагов в игре.
	*/

import com.etc.HelthBar_mc;

import flash.display.Sprite;
	import flash.display.MovieClip;
	import flash.geom.Point;
	
	import com.framework.PathFinder;
	import com.framework.math.*;
	
	import com.towerdefence.Universe;
	import com.towerdefence.interfaces.IGameObject;
	import com.towerdefence.gui.HealthBar;
	
	public class EnemyBase extends Sprite implements IGameObject
	{
		//---------------------------------------
		// CLASS CONSTANTS
		//---------------------------------------
		
		// ... по мере появления новых врагов список
		// констант будет пополнятся
		
		//---------------------------------------
		// PUBLIC VARIABLES
		//---------------------------------------
		public var isDead:Boolean = false;
		
		//---------------------------------------
		// PRIVATE VARIABLES
		//---------------------------------------
		protected var _universe:Universe = Universe.getInstance();
		
		// Уникальные характеристики врагов
		protected var _type:String = "None"; // Разновидность
		protected var _sprite:MovieClip; // Графический спрайт
		protected var _health:Number = 1; // Здоровье
		protected var _defSpeed:Number = 50; // Скорость
		protected var _isFree:Boolean = true;
		
		protected var _position:Point; // Текущее положение врага
		protected var _target:Point; // Цель куда должен прийти враг
		protected var _speed:Avector = new Avector();
		
		protected var _way:Array; // Маршрут врага
		protected var _isWay:Boolean = false; // Определяет существование маршрута
		protected var _wayIndex:int = 0; // Текущий индекс маршрута
		protected var _wayTarget:Point; // Текущая цель
		protected var _targetPos:Avector = new Avector();
		
		protected var _healthBar:HealthBar = null;
		
		//---------------------------------------
		// CONSTRUCTOR
		//---------------------------------------
		
		/**
		 * @constructor
		 */
		public function EnemyBase()
		{
			// nothing
		}

		/**
		 * @destructor
		 */
		public function free():void
		{
			if (_sprite != null && contains(_sprite))
			{
				removeChild(_sprite);
			}
			
			if (_universe.contains(this))
			{
				_universe.removeChild(this);
			}
			_universe.enemies.remove(this);
		}
		
		//---------------------------------------
		// PUBLIC METHODS
		//---------------------------------------
		
		/**
		 * Инициализация врага перед его использованием.
		 */
		public function init(posX:int, posY:int, targetX:int, targetY:int):void
		{
			if (_sprite != null)
			{
				addChild(_sprite);
			}
			
			// Если полоса жизни не инициализирована, создаем её
			if (_healthBar == null)
			{
//				_healthBar = new UnitHealthBar_mc();
				_healthBar = new HelthBar_mc();
				addChild(_healthBar);
			}
			_healthBar.reset(_health); // Устанавливаем максимальное здоровье
			
			// Обнуляем базовые параметры
			isDead = false;
			_isFree = false;
			_speed.set(0, 0);
			
			// Запоминаем положение и цель врага
			_position = new Point(posX, posY);
			_target = new Point(targetX, targetY);
			
			// Устанавливаем положение врага в пикселях
			x = Universe.toPix(posX);
			y = Universe.toPix(posY);
			
			// Устанавливаем врага на карте
			_universe.enemies.add(this);
			_universe.addChild(this);
			
			// Ищим маршрут
			var pathFinder:PathFinder = new PathFinder(_universe.mapMask);
			pathFinder.freeCell = Universe.STATE_CELL_FREE;
			_way = pathFinder.findWay(_position, _target);
			
			if (_way.length == 0)
			{
				trace("EnemyBase::init() - Путь не найден!");
			}
			else
			{
				// Путь найден!
				_isWay = true;
				_wayIndex = 0; // Текущий шаг
				setNextTarget(); // Устанавливаем цель
			}
		}


		/**
		 * Общий метод в котором производятся
		 * расчеты для всех врагов.
		 */
		public function update(delta:Number):void
		{
			
		}
		
		/**
		 * Добавляет урон юниту.
		 */
		public function addDamage(damage:Number):void
		{
			_healthBar.update(_health);
		}
		
		//---------------------------------------
		// PROTECTED METHODS
		//---------------------------------------
		
		/**
		 * Устанавливает цель юниту.
		 */
		protected function setNextTarget():void
		{
			if (_wayIndex == _way.length)
			{
				// Вес маршрут пройден
				_isWay = false;
			}
			else
			{
				// Новая цель
				_wayTarget = _way[_wayIndex];
				_targetPos.set(Universe.toPix(_wayTarget.x), Universe.toPix(_wayTarget.y));
				_targetPos.x += Amath.random(-10, 10);
				_targetPos.y += Amath.random(-10, 10);
				
				// Расчет угла между текущими координатами и следующей точкой
				var angle:Number = Amath.getAngle(x, y, _targetPos.x, _targetPos.y);
				
				// Установка новой скорости
				_speed.asSpeed(_defSpeed, angle);
				
				// Разворот спрайта
				_sprite.rotation = Amath.toDegrees(angle);
			}
		}
		
		//---------------------------------------
		// GETTER / SETTERS
		//---------------------------------------
		
		/**
		 * Возвращает разновидность врага.
		 */
		public function get type():String
		{
			return _type;
		}
		
	}

}